{\rtf1\ansi\ansicpg1252\cocoartf949
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;\red19\green34\blue255;}
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural

\f0\fs24 \cf0 ControlAPIChange-1: \
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	update IOAudioControl and IOAudioPort with types and defines renamed\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
ControlAPIChange-2: \
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	IOAudioSelectorControl implementation\
-	Added ranges to IOAudioLevelControl\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
ControlAPIChange-3: \
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added defaultAudioControl attachments to IOA\cf2 \
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.2f1\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Cleared out fields in clientBuffer in removeClient\cf2 \
\cf0 oStream.  \
-	Updated IOAudioDMAEngine::addDefaultAudioControl() to only accept controls on all channels.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
ControlAPIChange-4:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added valueChangeCallback to IOAudioControl\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
\
AudioFamilyAdditions-2-1:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Integrated ControlAPIChanges\
-	Integrated DMAEngineNotifications\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
AudioFamilyAdditions-2-2:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Integrated AsyncSleepWake\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
AudioFamilyAdditions-2-3:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Changed existing startDMAEngine() and stopDMAEngine() to performDMAEngineStart() and performDMAEngineStop() (drivers now implement those instead - all functions a driver needs to override should begin with perform)\
-	startDMAEngine() and stopDMAEngine() (and now pauseDMAEngine()) enact the change rather than get called to perform the change\
-	Added DMAEngine start and stop notifications\
-	Changed names of _set...() functions to set...()\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
AudioFamilyAdditions-2-4:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added stream available flag to IOAudioStream\
-	Added DMA engine sample offset property\
-	Added IOAudioDevice short name\
-	Added localized bundle and HAL plugin properties\
-	Added notifications to support idle power state\
-	Removed registerService() from IOAudioDMAEngine::start() - it is already done in IOAudioDevice::activateDMAEngine()\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
\
IOAudioFamily-1.1d1:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Removed IOAudioDMAEngine restriction on default controls (was only controls on all channels)\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d2:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added default implementations of performDMAEngineStart(), performDMAEngineStop() and performPowerStateChange()\
-	Removed old declarations in IOAudioDMAEngineUserClient\
-	Added -ffindirect-virtual-calls to CFLAGS of float lib\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d3:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added stream description property (and optional description parameter to IOAudioStream::initWithAudioDMAEngine())\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d4:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added debug logs to IOAudioDevice\
-	Added code to IOAudioDMAEngine to set audioDevice on default audio controls\
-	Added stopDMAEngine() call to IOAudioDMAEngine::stop()\
-	Updated IOAudioDMAEngine::removeUserClients() to only set stop position if it was running\
-	Fixed a couple of comparisons that were assignments (if performDMAEngineStart() or Stop() ever failed, the result would be ignored)\
-	Updated some debug logs in IOAudioDMAEngine\
-	Removed debug log from IOAudioDMAEngineUserClient::getExternalMethodForIndex()\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1d5:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Removed default audio control support from IOAudioStream - now only IOAudioDMAEngines get default audio controls\
-	Fixed bug in IOAudioStream that caused the mix buffer to be leaked\
-	Removed wakingFromSleep variable in IOAudioDevice - it now has power state instead\
-	Added takeTimeStamp() to IOAudioDMAEngine to make it simpler for drivers to take timestamps at start time and interrupt time\
-	Updated debug logs\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d6:\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug in the wake code causing the DMA engines and timers not to be restarted\
-	Added IOAudioDMAEngine::resumeDMAEngine() to match pauseDMAEngine()\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d7\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Renamed type IOAudioControl::IOAudioControlValueChangeCallback to IOAudioControl::ValueChangeCallback\
-	Removed wakingFromSleep variable in IOAudioDevice (use of wakingFromSleep was removed in 1.1d5, but variable was accidentally left in header)\
-	Changed the return types for the following functions from bool to IOReturn\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	IOAudioDevice::activateAudioDMAEngine()\
-	IOAudioDevice::attachAudioPort()\
-	IOAudioDMAEngine::addAudioStream()\
-	IOAudioPort::addAudioControl()\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added implementation of idle power state in IOAudioDevice\
-	More debug logs in IOAudioDevice\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d8\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added IOAudioControl headerdoc\
-	Changed control value type to SInt32\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	This includes changes to all APIs involving the control value\
-	Also includes min and max values in IOAudioLevelControl \
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added IOAudioControl::validateValue() which is called by the control to validate a new value before setting it\
-	Added IOAudioControl::updateValue() which is called by the control to store a new value in the control\
-	Added error IOLog() calls in IOAudioControlnto indicate when the driver has returned an error in various cases.  This should make it easier for driver writers to detect problems.\
-	Added IOAudioControl::hardwareValueChanged() to allow a driver to indicate that the hardware underlying an IOAudioControl has changed.\
-	Added IOAudioControl::createUserClient() which is called by IOAudioControl::newUserClient().  This allows a subclass to override the class used for the IOUserClient.\
-	Added clientStart() and clientStop() functions to IOAudioDMAEngineUserClient to allow the HAL to indicate when it is using the IOAudioDMAEngine (this used to be handled by whether the HAL had an open connection to the DMA engine, but the HAL needs to maintain the connection all of the time because it needs the connection to receive the various notifications).\
-	Changes to the IOAudioDMAEngine to keep track of when it is in use differently - it now uses a separate call from the user client\
-	Added IOAudioDMAEngine::createUserClient() to allow subclasses to override the class of the user client\
-	Updated some of the kIOAudioPortSubType... four-char-codes to match the Mac OS 9 codes\
-	Split the speaker and microphone sub types to internal and external versions\
-	Removed kIOAudioInputPortSubTypeModem\
-	Added sender field to the IOAudioNotificationMessage struct to pass an extra field to the HAL in some notifications.  For the stream format change notification to contain the io_object_t of the stream who's format has changed.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d9\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed bug in which clientClose() didn't decrement the number of active user clients if it was active\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d10\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a problem with performFlush() in which it was still checking the number of clients to decide if the DMA engine should be stopped instead of the number of active clients.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d11\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Updated headerdoc in IOAudioDevice\
-	Removed call to IOAudioDevice::performFormatChange() that was called when it wasn't implemented in IOAudioDMAEngine . It is not needed.\
-	Removed IOAudioDMAEngine::removeAudioStream() - removing a stream is not supported.\
-	Updated some IOAudioDMAEngine headerdoc\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d12\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added detachUserClients() in IOAudioControl to clean up the user clients when the driver is being torn down (called from stop())\
-	Fixed a bug in IOAudioControl::removeUserClient() which would cause the IOAudioControlUserClient objects to leak\
-	Updated IOAudioControlUserClient entry points to check for inactive - an error is returned if the driver is being torn down\
-	Fixed a bug in the default audio control teardown code that could cause the controls to leak\
-	Fixed a bug in IOAudioStream::validateFormat() that would report a valid format as invalid.\
-	Added selection value enums to match desired input and output selection values\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d13\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added support to IOAudioLevelControl for negative infinity (new function addNegativeInfinity(UInt32))\
-	Added support for separate input and output sample latency values to IOAudioDMAEngine\
-	Added getType(), getSubType() and getUsage() to IOAudioControl\
-	Updated IOAudioDMAEngine to attach single-channel controls to the appropriate IOAudioStream\
-	Added IOAudioDMAEngine::getAudioStream(IOAudioStreamDirection direction, UInt32 channelID) to allow individual streams to be found based on their direction and channel information\
-	Updated IOAudioControl base value type to OSObject *.\
-	Removed support for calling IOAudioDevice::performAudioControlValueChange() when a control value changes\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d14\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug causing format change notifications not to be sent to the HAL\
-	Removed mention of performAudioControlValueChange() in comments\
\pard\tx360\tx2880\tx4320\tx5760\tx7200\li360\fi-180\ql\qnatural
\cf0 \
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1d15\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug in IOAudioControl with int value changes not passing the correct value to the value change handler\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d16\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Individual channel controls are now attached to the DMA engine rather than the stream\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d17\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug in the stream format changing code that didn't reallocate the mix buffer when the number of channels changed\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d18\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a small bug in the new mix buffer realloc code\
-	Added small class description of IOAudioFamily\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d19\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Renamed IOAudioDMAEngine -> IOAudioEngine (and all other similarly named classes, vars, types, etc...)\
-	Removed IOAudioJackControl\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d20\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Change in mix/clip implementation to only clip once per set of samples\
-	Remove IOAudioEngine::mixAndClip()\
-	Added IOAudioEngine::mixOutputSamples()\
-	Changed IOAudioEngine convertFromInputStream() -> convertInputSamples() and clipToOutputStream() -> clipOutputSamples()\
-	Added setIOFunction(), setIOFunctionList() to IOAudioStream to allow custom lists of clip/conversion functions in each stream.\
-	Added params to addAvailableFormat() to allow custom I/O function(s) to be set on each format\
-	Changed IOAudioControl to release handler target at stop() time instead of free().  This avoids a potential circular reference between the target and control causing neither to be freed at terminate time.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1d21\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added loopCount to clientIO function from HAL\
-	Updated IOAudioStream::processOutputSamples() to use loopCount from HAL - fixes a bug where running clients would stop playing if a new client with a larger buffer started up (typically happens when Classic starts to play sound while another app is playing)\
-	Added support for buffer sets in IOAudioEngineUserClient\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	Added bufferSetID param to registerClientBuffer(), unregisterClientBuffer() and performClientIO()\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Updated clientIO function to return kIOReturnOffline if either the client has been taken offline or if the engine isn't running\
-	Added pauseAudioEngine() and resumeAudioEngine() calls around format change\
-	Changed pause/resume behavior to take all clients offline when pausing and disallow them from being taken online until the engine is resumed\
-	Added kIOAudioEngineResumed state to indicate that the engine is not running, but it is OK to start up when requested by a client\
-	Added code to pauseAudioEngine() to hold all of the stream IO locks while pausing.  This ensures that the engine will not get paused while doing I/O.\
-	Added kIOAudioEnginePausedNotification and kIOAudioEngineResumedNotification\
-	Added the ability to change numSampleFramesPerBuffer while the engine is not running.\
-	Updated IOAudioEngineUserClient::performClientIO() to return an error (kIOReturnOffline) if either the client is offline or the engine is not running.\
-	Added starting channel number property (kIOAudioStreamStartingChannelNumberKey) to IOAudioStream and channel number property to IOAudioControl (kIOAudioControlChannelNumberKey).  They get updated when the channel layout changes.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d22\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Updated IOAudioControl channelNumber to be -1 when the control's channel is inactive\
- Fixed leak in IOAudioEngine::updateChannelNumbers()\
- IOAudioEngine changes\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	Changed type of audioEngines from OSSet to OSArray\
-	Removed masterControls\
-	Removed addMasterControl(), setMasterVolumeLeft(), setMasterVolumeRight() and setMasterMute()\
-	Renamed deactivateAudioEngines() to deactivateAllAudioEngines()\
-	Removed deactivateAudioEngine() (not supported anyway)\
-	Renamed clearTimerEvents() to removeAllTimerEvents()\
-	Renamed deactivateAudioPorts() to detachAllAudioPorts()\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Removed IOAudioManager\
-	Removed master, setMaster() and isMaster() from IOAudioLevelControl and IOAudioToggleControl.\
-	Added IOAudioEngine::hardwareSampleRateChanged()\
-	Added IOAudioStream::hardwareFormatChanged()\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1d23\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added 'IOAudioEngineGlobalUniqueID' property to IOAudioEngine (kIOAudioEngineGlobalUniqueIDKey)\
- Added IOAudioEngine functions getGlobalUniqueID() and getLocalUniqueID()\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	getGlobalUniqueID() by default generates a unique ID by concatenating the class name, the location of audioDevice->getProvider() and the result of getLocalUniqueID().  It is needed to generate a persistent unique ID by which the HAL can always recognize the same IOAudioEngine.\
-	getLocalUniqueID() needs to generate a scoped ID local to the device.  The default implementation returns an index based on the order that the IOAudioEngine was added to the IOAudioDevice.  If that isn't sufficient to guarantee uniqueness for the engine, this should be overridden to provide a better ID.\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added IOAudioEngine::setDescription() and description property (kIOAudioEngineDescriptionKey - 'IOAudioEngineDescription').\
-	Added setCoreAudioPropertyID() to IOAudioControl (new property 'IOAudioControlCoreAudioPropertyID')\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	The HAL will pass thru CoreFoundation objects passed to AudioDeviceSetProperty().  They can be CFNumber, CFString, CFData, etc... and will be turned into OSObjects in the kernel (OSNumber, OSString, OSData, etc...).\
-	A new usage has been added to allow the HAL to recognize the controls which should be used for custom properties (kIOAudioControlUsageCoreAudioProperty)\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added IOAudioEngine::resetClipPosition() that gets called if a stream has to reset the clip position to an earlier position\
-	Updated IOAudioEngine::hardwareSampleRateChanged() to pause/resume the engine around the change if it is running (i.e. if the driver hasn't already done so)\
-	Fixed IOAudioStream to properly deal with non-mixable formats\
\pard\tx720\tx2880\tx4320\tx5760\tx7200\li720\fi-180\ql\qnatural
\cf0 -	Doesn't mix when a non-mixable format is set\
-	Doesn't allocate a mix buffer when not mixing\
-	Frees existing mix buffer if a non-mixable format gets set\
-	Prevents more than one client from registering a buffer for the stream if non-mixable (registerClientBuffer() returns kIOReturnExclusiveAccess in this case)\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d24\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added function padding for binary compatibility to all classes\
-	Fixed leaks in IOAudioControl::setValue(SInt32), IOAudioControl::sendValueChangeNotification() and IOAudioSelectorControl::addAvailableSelection().\
-	Renamed IOAudioEngine::removeDefaultAudioControls() to removeAllDefaultAudioControls()\
- Added IOAudioEngine::removeDefaultAudioControl() that can be called while the engine is stopped (and will send a configuration change notification if a configuration change is not in progress)\
-	Added stopEngineAtPosition() as a convenience location where the family calls when it needs to stop the engine at a certain location (e.g. when the last client has disconnected and the engine should stop at a point after it has played samples).  By default the function makes sure the timer is running and checks the current location vs. the stop position and calls stopAudioEngine() if it is passed the stop position.  This makes it easy for a driver to override that behavior if there is a different mechanism they want to use to decide when to stop.\
-	Fixed addDefaultAudioControl() so it calls updateChannelNumbers() if called after the engine has started up.  This ensures that all controls get a proper channel number no matter when they are added.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.1d25\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug in IOAudioControl::attachAndStart() that would return failure if the control had already been started (should return success).  This could cause the control not to get added to the list of default audio control in the IOAudioEngine and cause it not to get a proper channel number set.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1d26\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug in IOAudioStream::readInputSamples() that caused it not to wrap around the end of the buffer.  This caused a small bit of garbage data to get into the audio stream.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1d27\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Updated OSBundleCompatibleVersion to 1.1d25\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc1\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added kIOAudioSelectorControlSubTypeClockSource for a clock source selector.\
-	Fixed bug in IOAudioEngine::takeTimeStamp() so that it will correctly use the timestamp argument if present.\
-	Fixed a bug in IOAudioEngineUserClient::stopClientAction() that caused it to always return kIOReturnBadArgument\
-	Fixed a bug in IOAudioEngine::updateChannelNumbers() causing input and passthru controls on the last channel to get a -1 channel number set instead of the correct one\
-	Added locking code to startClient() and stopClient to protect the client buffer list\
-	Updated IOAudioEngine::pauseAudioEngine() to avoid calling sendNotification() while holding the stream locks (this could cause a deadlock)\
-	Added a watchdog timer which will fire if a client takes too long to perform output\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc2\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a new bug in IOAudioEngineUserClient causing the IOAudioEngine to not be stopped in some cases.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc3\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Removed a '#define DEBUG' that was accidentally left in IOAudioStream.cpp.  This caused a bunch of extra log messages that shouldn't be there.\
-	Fixed an edge case in IOAudioEngineUserClient::performClientOutput() that caused samples not to be played if the watchdog had fired but the samples showed up in time.  The design is supposed to allow up to a client buffer full of late samples to be output.  But the bug caused the case when the size of the late samples was the size of the entire client buffer to fail.  Anything less than a buffer full worked fine. \
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc4\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added a lock/unlock for the user client buffer lock in IOAudioClientBufferSet::watchdogTimerFired() to fix a potential double-free of the buffer set (which would then cause a panic).\
-	Updated format changing code in IOAudioStream to grab all of its clients locks before taking the stream IO lock to avoid a deadlock if other apps are playing audio.  The old code would try to get the user client buffer lock after taking the stream IO lock, while the IO path would take them in the opposite order.\
-	Added IOAudioEngineUserClient functions registerBuffer(), unregisterBuffer(), registerBufferAction() and unregisterBufferAction().  This is to move un/registerClientBuffer() functions to the IOWorkLoop.\
-	Added Examples and Templates to project - still need to add them to the copy files build phase to make sure they get installed.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc5\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug where the channel numbers wouldn't get updated if IOAudioDevice::activateAudioEngine() was called while IOAudioEngine::start() was in progress.\
-	Added code to clear the sample buffers when the engine is paused.\
-	Made getWorkLoop() functions const to match the IOService prototype.\
-	Changed watchdog timeout to be 90% plus a 125us thread latency padding\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc6\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fixed a bug causing the IOAudioEngineUserClient (and IOAudioControlUserClient) not to have stop() called on it and sometimes not be freed.  The user client was being detached from the engine after the call to terminate().  Unfortunately that interfered with the call to stop() and friends.  The solution was to not call detach() at all.  The terminate() function takes care of that automatically.\
-	Added the Examples directory to the install copy files build phase to have it copied at install time.\
-	Fixed a bug in the watchdog timeout calculation that caused the timer to fire 250us later than it should have.  The thread latency padding was being added to the timeout value rather than subtracted from it.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc7\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Updated mix function with main loop unrolled 4x.  Should give a 15-20% performance boost of the mix code.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.1fc8\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added bounds checking of the firstSampleFrame parameter to IOAudioEngineUserClient::performClientIO()\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.2f1\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Cleared out fields in clientBuffer in removeClient\cf2 \
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.3.0b2\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Added support for non-mixable formats, such as AC-3\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf2 \
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.3.0b3\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Made the calling of the mix routine a little smarter by not calling if there is only one client.  This adds mixOutputSamples to IOAudioStream which just does a bcopy when there is only one client.\
- Added createPassThruMuteControl and createPassThruVolumeControl functions to make creating pass through controls a little more obvious and easy.\
- Added createOutputSelector to make the creation of an output selector a little easier and more obvious.\
- IOAudioLevelControl would default to creating a volume control if the subtype was 0.  Now you can pass in a subType of anything, including 0, and have the control created that way.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.3.1\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Remove the IOLog of "!!! firstSampleFrame > audioEngine->numSampleFramesPerBuffer (XXX > YYY)" messages\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.3.2\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Fix instance of taking the address of a cast variable.  Take the address and make the cast to be of a pointer instead.  New compliers flag this syntax error, previous ones didn't.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.3.2fc2\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Make sure that the IOAudioDevice driver has gotten a call to performPowerStateChange before calling performAudioEngineStart so that the hardware is told to go active before it is told to play audio.  Fixes a bug where playing a QuickTime file across sleep/wake could cause AppleOnboardAudio to not be able to play any audio (system-wide loss of audio).\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.5.0b1\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 -	Add a function that can be overridden by a subclass to erase only the mix or sample buffer.\
- Add functions to allow sub classes of IOAudioEngine to lock and unlock IOAudioStreams for io instead of forcing them to lock/unlock all streams.\
- Show how to localize audio drivers in the PhantomAudioDriver example (in IOAudioDevice).\
- Implement a queue of notifications so that CoreAudio only gets fewer control changed notifications when changing a control's parameters if beginConfigurationChange has been called.\
- Fixed a leak in IOAudioControl that could prevent unloading of subclassed controls.\
- Fixed a race condition that could cause a panic across sleep wake while playing audio.\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 \
IOAudioFamily-1.5.0b2 through 1.5.0b8\
      - modified SMPTE time struct to match CoreAudio updates\
      - added 'solo' subtype for toggle controls.	\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - remove strings for new localization.\
- added clock domain property\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b9\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - publish the clock domain property for every driver.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b10\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - make control value errors only show up in debug builds\
- removes some CFBundle strings from the sample drivers \
- fixes some header comments for documentation generation\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b11\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - power management panic avoidance \
- use sample rate when validating a format change \
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b12\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - use acknowledgeSetPowerState() at the request of power management team\
- remove unused audio plane in the IO Registry\
- fix a binary compatibility problem introduced in 150b13\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b13\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - adds: VBR support and separate safety offsets for input and output.\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b14\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 - fixes removal of string from info.plist\
\
\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural
\cf0 IOAudioFamily-1.5.0b15\
      - set default value for sample frames read by engine, allows overriding of readInputSamples while still handling VBR requests from the HAL\
	  \
IOAudioFamily-1.6.4b7\
      - added compatability methods for Leopard so PPC builds against Tiger headers continue to function\
\
IOAudioFamily-1.6.4b8\
      - remove reference to outdated include file.\
\
\
\
\pard\tx540\tx2880\tx4320\tx5760\tx7200\li540\fi-180\ql\qnatural
\cf0 \
\
\
\
}